# ------面向对象设计-----------
def Dog(name,gender,type):
    def jiao(dog):
        print ('一只狗%s 在叫' % dog["name"])
    def kanjia(dog):
        print ('一只狗%s 在看家' % dog["type"])
    def init(name,gender,type):
        dog={"name":name,
              'gender':gender,
              "type":type,
              "kanjia":kanjia,
              'jiao':jiao,
             }
        return dog
    res = init(name,gender,type)
    return res
d1=Dog('旺财','公','藏獒')
d2=Dog('大黄','母','哈撒奇')
print(d1)
d1['jiao'](d1)   # >>>一只狗旺财 在叫
d2['kanjia'](d2) # >>>一只狗哈撒奇 在看家
# --------------面向对象编程-------------------
# (1)构造初始化函数通过初始化函数返回对象数据的属性
class Chinese:
    '''定义一个中国人的类'''
    pifu='黄皮肤'
    # # 初始化方法一定义初始化name,age,gender为传入参数、需要返回字典（类的数据属性）
    # def init(name, age, gender):
    #     dict={
    #         'mingzi':name,
    #         'nianji': age,
    #         'xingbie':gender
    #     }
    #     return dict
    def __init__(self,name,age,gender):
        # 初始化构造函数方法二、内置的__init__不用return结果、class类自动返回、name,age,gender为传入参数
        self.mingzi=name
        self.nianji =age
        self.xingbie=gender
    def tutan(self):
        # class下面定义的方法必须有个参数
        print("%s 朝着墙上吐了一口痰" % self.mingzi)
    def chadui(self):
        print("插到了%s前面" % self.mingzi)

    def eatFood(self,food):
        print("%s正在吃%s" % (self.mingzi,food))
Chinese.__dict__ # >>>查看类的数据属性字典形式
print(Chinese.__dict__)
person1 =Chinese('张三',25,'男')
print(Chinese.chadui(person1)) # >>>插到了张三前面
# 实例化对象、与函数方法的执行一致、通过'类字+()' 实现、自动触发__init__的执行
# 传入参数相当于self=person1,name='张三',age=25,gender='男'
print(person1)
# >>> <__main__.Chinese object at 0x0000024D3D3F8BE0>  是一个对象
print(person1.__dict__['mingzi'])
# >>>张三
print(person1.mingzi) # 同过'对象名+.'的方式获取对象的数据属性
# >>>张三
print(person1.__dict__) # >>>通过'对象名+内置属性方法__dict__'获取对象的属性
# >>>{'mingzi': '张三', 'nianji': 25, 'xingbie': '男'}
print(person1.pifu)
# >>>黄皮肤(数据属性中查找、找不到就往上找直到类)
person2 =Chinese('萌萌',18,'女')
Chinese.chadui(person2)
Chinese.tutan(person1)
print(person1.tutan())

person3 =Chinese('萌妹',19,'女')
print(person3.eatFood('香蕉'))

# -------类的增删改查--------------
class GetDriver:
    type ="浏览器驱动"
    def __init__(self,broswername,drivername):
        self.broswername = broswername
        self.drivername = drivername
    def getpath(self,drivername):
        print('%s正在启动%s' %(self.broswername,drivername))

Google =GetDriver('Google','gooledriver')

# 类属性的查询
print('以下是对类属性的操作结果')
print(GetDriver.__dict__)
# 类属性的添加
GetDriver.function ="启动浏览器"
GetDriver.version ="个浏览器的版本"

def openbaidu(self):
    print("给对象添加函数属性")
print('___________')
Google.open = openbaidu
print(Google.open)
print(Google.__dict__)
print('___________')
print(GetDriver.__dict__)
print(GetDriver.__dict__['version'])
# 类属性的值修改
GetDriver.type ="不同类型的浏览器驱动"
print(GetDriver.__dict__)
del GetDriver.version
print(GetDriver.__dict__)
# -------------实例对象的增删改查-----------
print('以下是对实例对象Google属性的操作结果')
# 查询实例对象的函数属性（即类的属性、实例对象没有函数属性只有数据属性）
print('查询是的函数属性-即类的属性',Google.getpath)
print('实例的数据属性',Google.getpath('googledriver.exe'))
# 给实例对象增加属性
Google.googleversion ='25.0.2'
print(Google.__dict__)
print('%s的版本' % Google,Google.googleversion)
# 删除实例对象增加属性
del Google.googleversion
print(Google.__dict__)

# 修改实例对象属性值
Google.drivername='DriverName'
print("对象属性修改过后的字典格式",Google.__dict__)
print('drivername修改过后的值是',Google.drivername)

# -------------局部作用域的练习------------
print(">>>>>>>局部作用域的练习>>>>>>>>>>>")
class China:
    country = "中国"
    def __init__(self,name):
        self.name = name
    def Action(self,name ,ball):
        print("%s 正在玩%s" %(self.name,ball))

p1 = China('Bob')
print(p1.country)
print("---修改实例对象的country---")
p1.country="韩国"
print('修改之后实例对象的国籍是:%s' % p1.country) #  >>>修改之后实例对象的国籍是:韩国
print('修改之后类国籍是:%s' % China.country) # >>>修改之后类国籍是:中国

city = '重庆','成都','武汉'
class province:
    city = '北京', '上海', '深圳'
    list=[12,32,42,87]
    def __init__(self,cityname):
        self.cityname = cityname
        print('--->',city)  # 调用普通变量与类对象无关（没有通过‘.’来调用）
    def findCity(self,action):
        print('%s 找到%s'%(self.cityname,action))

shenfen =province('四川')
print(shenfen.__dict__)
print("<<<<<<<<<<<<<")
print(shenfen.city)
print(shenfen.findCity('深圳'))

print(shenfen.list)
print(shenfen.__dict__) # >>>{'cityname': '四川'}
print(province.__dict__)
print(shenfen.list)
print("》》》》》》》》")
shenfen.list=[1,3,2,32,5,6] # 不是修改、被重新赋值
print(shenfen.__dict__) # 实例对象被赋值
shenfen.list.append(9999999)
print(")))))))))))))))))")
print(province.__dict__)

